package com.xpp.yanbi.manager;

import cn.hutool.http.Header;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.xpp.yanbi.common.ErrorCode;
import com.xpp.yanbi.exception.BusinessException;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Moonshot Ai服务
 */
@Service
@Slf4j
public class MoonshotAiService {

    /**
     * api_key
     */
    @Value("${moonshot.api-key}")
    private String API_KEY;

    /**
     * api 地址
     */
    @Value("${moonshot.api-url}")
    private String CHAT_COMPLETION_URL;

    /**
     * 模型
     */
    @Value("${moonshot.model}")
    private String model;

    public String doChat(@NonNull String message) {
        if (StringUtils.isEmpty(message)) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR);
        }

        // 系统预设
        final String SYSTEM_PROMPT = "你是一个数据分析师和前端开发专家，接下来我会按照以下固定格式给你提供内容：\n" +
                "分析需求：\n" +
                "{数据分析的需求或者目标}\n" +
                "原始数据：\n" +
                "{csv格式的原始数据,用,作为分隔符}\n" +
                "\n" +
                "请根据以上这两部分内容，按照以下指定格式生成内容（此外不要输出任何多余的开头、结尾、注释）\n" +
                "【【【【【【【\n" +
                "{前端 Echarts v5 的 options 配置对象js代码（json格式），合理地将数据进行可视化，不要生成任何多余的内容，比如注释}\n" +
                "【【【【【【【\n" +
                "{明确的数据分析结论、越详细越好、不要生成多余的注释。}";
        List<Message> messages = new ArrayList<>();
        messages.add(new Message("system", SYSTEM_PROMPT));
        messages.add(new Message("user", message));
        // 构造请求条件
        Map<String, Object> requestBody = new HashMap<>();
        requestBody.put("model", model);
        requestBody.put("messages", messages);
        requestBody.put("stream", false);
        try {
            // 转换为json格式
            String json = JSONUtil.toJsonStr(requestBody);
            // 调用接口
            String result = HttpRequest.post(CHAT_COMPLETION_URL)
                    .header(Header.AUTHORIZATION, "Bearer " + API_KEY)// 头信息，多个头信息多次调用此方法即可
                    .body(json)// 表单内容
                    .timeout(20000)// 超时，毫秒
                    .execute().body();

            // 解析json结果,获取 ai 响应结果
            Map resultMap = JSONUtil.toBean(result, Map.class);
            JSONArray choicesArr = (JSONArray) resultMap.get("choices");
            Map choicesMap = (Map) choicesArr.get(0);
            Map messageMap = (Map) choicesMap.get("message");
            String content = (String) messageMap.get("content");
            log.info("AI 响应:{} ", content);
            return content;
        } catch (Exception e){
            log.error("AI 响应异常:{} ", e.toString());
            throw new BusinessException(ErrorCode.OPERATION_ERROR,"AI 响应异常");
        }
    }
}
